<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>10.3 处理歧义和不确定性的提示词策略 - Langchain框架教程</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h1> 第十章：AI系统提示词设计进阶</h1>
        <section id="s10-3">
            <h2>10.3 处理歧义和不确定性的提示词策略</h2>
            <p>大型语言模型（LLM）在处理模糊、不明确或信息不完整（不确定性）的用户输入时，可能会产生不准确、不相关甚至误导性的回答。设计能够有效处理歧义（Ambiguity）和不确定性的提示词，是构建健壮AI应用的重要一环。</p>

            <h3>歧义和不确定性的来源</h3>
            <ul>
                <li><strong>用户输入模糊：</strong> 用户使用了含糊不清的词语、省略了关键信息或表达方式不规范。</li>
                <li><strong>领域知识不足：</strong> LLM对特定领域或上下文缺乏深入理解，导致无法正确解释用户意图。</li>
                <li><strong>多重含义：</strong> 用户输入的词语或短语存在多种可能的解释。</li>
                <li><strong>信息缺失：</strong> 完成任务所需的信息在用户输入或可用上下文中不完整。</li>
            </ul>

            <h3>处理歧义和不确定性的提示词策略</h3>
            <p>以下是一些通过提示词引导LLM处理歧义和不确定性的有效策略：</p>

            <ol>
                <li>
                    <strong>要求澄清 (Request Clarification):</strong>
                    <p>当LLM遇到歧义时，最直接的方法是指示它主动向用户寻求澄清。这比模型“猜测”用户意图并可能出错要好得多。</p>
                    <pre><code class="language-python">
# (接上一节的Qwen LLM初始化代码)
# from langchain_openai import ChatOpenAI
# from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
# from langchain_core.output_parsers import StrOutputParser
# import os
#
# api_key = os.environ.get("DASHSCOPE_API_KEY")
# qwen_llm = ChatOpenAI(
#     base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
#     api_key=api_key,
#     model="qwen-plus",
#     temperature=0.1
# )

system_prompt_clarify = """
你是一个智能助手。如果用户的问题存在歧义或信息不完整，导致你无法给出明确的回答，请不要猜测。
而是礼貌地指出问题所在，并询问用户需要你澄清或补充哪些信息。
例如，如果用户说“帮我预订”，你可以问“请问您想预订什么？（例如：机票、酒店、餐厅）以及相关的日期和地点？”
"""

prompt_template_clarify = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(system_prompt_clarify),
    HumanMessagePromptTemplate.from_template("用户输入：{user_input}")
])

clarify_chain = prompt_template_clarify | qwen_llm | StrOutputParser()

# 测试模糊输入
ambiguous_input = "我需要那个报告。"
response = clarify_chain.invoke({"user_input": ambiguous_input})
print(f"用户输入: {ambiguous_input}")
print(f"AI回应: {response}")

# 测试另一个模糊输入
another_ambiguous_input = "关于昨天的会议，有什么更新吗？"
response = clarify_chain.invoke({"user_input": another_ambiguous_input})
print(f"用户输入: {another_ambiguous_input}")
print(f"AI回应: {response}")
                    </code></pre>
                    <p>通过这种方式，AI将学会识别不确定性并主动引导用户提供更精确的信息。</p>
                </li>
                <li>
                    <strong>列出可能的解释 (List Possible Interpretations):</strong>
                    <p>对于存在多种合理解释的歧义，可以指示LLM列出这些可能性，并询问用户哪一种是他们想要的。</p>
                    <pre><code class="language-python">
system_prompt_interpretations = """
你是一个理解力强的助手。如果用户的问题可能存在多种合理的解释，请列出这些可能的解释，并询问用户哪一种最符合他们的意思。
例如，如果用户说“我喜欢苹果”，你可以回应“您说的‘苹果’是指水果苹果还是苹果公司(Apple Inc.)？请您明确一下。”
"""

prompt_template_interpretations = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(system_prompt_interpretations),
    HumanMessagePromptTemplate.from_template("用户输入：{user_input}")
])

interpretations_chain = prompt_template_interpretations | qwen_llm | StrOutputParser()

# 测试多义输入
polysemous_input = "请帮我查一下银行。"
response = interpretations_chain.invoke({"user_input": polysemous_input})
print(f"用户输入: {polysemous_input}")
print(f"AI回应: {response}")
                    </code></pre>
                </li>
                <li>
                    <strong>设定默认行为 (Define Default Behavior):</strong>
                    <p>在某些情况下，如果无法获得澄清，可以为LLM设定一个默认的、最安全或最常见的行为。但这应谨慎使用，并确保用户知道AI可能采取的默认行动。</p>
                    <p>例如：“如果用户没有指定日期，默认查询今天的股票价格。”</p>
                </li>
                <li>
                    <strong>利用上下文信息 (Leverage Contextual Information):</strong>
                    <p>在Langchain中，通过Memory或Retrieval等机制为LLM提供更丰富的上下文信息，可以帮助模型更好地理解用户意图，减少歧义。例如，如果对话历史表明用户一直在讨论某个特定项目，那么“那个报告”可能就指向该项目的报告。</p>
                </li>
                <li>
                    <strong>限制回答范围 (Limit the Scope of Answers):</strong>
                    <p>在系统提示中明确AI的知识范围或回答边界，可以避免模型在不确定或超出其能力范围时“胡编乱造”。</p>
                    <p>例如：“你只回答与本公司产品A相关的问题。对于其他问题，请告知用户你无法提供帮助。”</p>
                </li>
                <li>
                    <strong>表达不确定性 (Express Uncertainty):</strong>
                    <p>在某些情况下，如果LLM对答案不确定，可以指示它诚实地表达这种不确定性，而不是给出错误的答案。</p>
                    <p>例如：“如果信息不确定，请在回答中包含‘我无法完全确定，但根据现有信息...’或类似的表述。”</p>
                </li>
            </ol>

            <h3>总结</h3>
            <p>处理歧义和不确定性是构建实用AI应用的关键挑战。通过在系统提示词中融入要求澄清、列出解释、设定默认行为、利用上下文、限制范围和表达不确定性等策略，我们可以显著提高LLM在面对不完美输入时的鲁棒性和可靠性，从而提供更优质的用户体验。</p>
        </section>

        <div class="navigation">
            <a href="../../langchain_tutorial_outline.html">返回教程目录</a>
            <a href="../chapter10/chapter10_2_persona_tone_style.html">&larr; 上一节：10.2 如何通过提示词设定AI的个性、语气和风格</a>
            <a href="../chapter10/chapter10_4_controlling_output_format.html">下一节：10.4 控制输出格式和结构 &rarr;</a>
        </div>
    </div>
</body>
</html>
